package top.xia17.plugins.fast.common.utils;


import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

/**
 * 时间间隔计算工具
 * 一般用于测试过程中计算代码执行的时间
 *
 * @author xia17
 * @since 2021/12/9 14:06
 */
@Slf4j
@Getter
public class TimeIntervalUtil {

    /**
     * 全局静态变量的是否写日志
     */
    public static boolean WRITE_LOG = true;

    /**
     * 名字
     */
    private final String name;

    /**
     * 是否打印日志
     */
    private final Boolean writeLog;

    public TimeIntervalUtil(String name) {
        this.name = name;
        this.writeLog = null;
    }

    public TimeIntervalUtil() {
        this.name = "";
        this.writeLog = null;
    }

    public TimeIntervalUtil(String name, boolean writeLog) {
        this.name = name;
        this.writeLog = writeLog;
    }

    /**
     * 时间
     */
    private long startTime;

    /** end()时的代码执行时间 */
    private long time;

    /**
     * 计数器
     */
    private int count = 1;

    /**
     * 开始计时
     */
    public void start() {
        this.startTime = System.currentTimeMillis();
        if (isWriteLog()) {
            log.info("{}时间间隔计算开始", getPrintPrefix());
        }
    }

    /**
     * 结束计时
     *
     * @return 返回时间间隔
     */
    public long end() {
        long interval = System.currentTimeMillis() - this.startTime;
        this.time = interval;
        if (isWriteLog()) {
            log.info("{}时间间隔计算结束，间隔时间为：{}", getPrintPrefix(), interval);
        }
        count++;
        return interval;
    }

    /**
     * 结束计时并且重新开始计时
     *
     * @return 返回时间间隔
     */
    public long endAndRestart() {
        long interval = this.end();
        this.start();
        return interval;
    }

    /**
     * 获取代码执行间隔时间
     *
     * @return 返回时间间隔
     */
    public long getTime() {
        return this.time;
    }

    /**
     * 获取打印日志时的前缀
     *
     * @return /
     */
    private String getPrintPrefix() {
        String s = "".equals(name) ? "" : "[" + name + "]";
        return s + "第" + count + "次";
    }

    /**
     * 是否打印日志
     *
     * @return /
     */
    private boolean isWriteLog() {
        return writeLog == null ? WRITE_LOG : writeLog;
    }

    /**
     * 静态方法 创建并且开始计算时间
     *
     * @return 返回工具类
     */
    public static TimeIntervalUtil createAndStart() {
        TimeIntervalUtil timeIntervalUtil = new TimeIntervalUtil();
        timeIntervalUtil.start();
        return timeIntervalUtil;
    }

    /**
     * 静态方法 创建并且开始计算时间
     *
     * @param name 名字
     * @return 返回工具类
     */
    public static TimeIntervalUtil createAndStart(String name) {
        TimeIntervalUtil timeIntervalUtil = new TimeIntervalUtil(name);
        timeIntervalUtil.start();
        return timeIntervalUtil;
    }


}
